package controllers;

import java.security.CryptoPrimitive;
import java.util.List;

import models.Jogador;
import play.data.validation.Email;
import play.data.validation.Unique;
import play.libs.Crypto;
import play.libs.Crypto.HashType;
import play.mvc.Controller;

public class Application extends Controller {

	static public void index() {
		if (session.contains("user")) {
			Panel.index();
		}
		render();
	}

	static public void login(@Email String login, String senha) {
		Jogador jogador = Jogador.find("email = ? OR nome = ?", login, login)
				.first();
		if (jogador != null) {
			if (jogador.senha.equalsIgnoreCase(Crypto.passwordHash(senha,
					HashType.SHA512))) {
				session.put("user", jogador.id);
				if (request.headers.containsKey("mobile")) {
					renderText("true");
				} else {
					Panel.index();
				}
			} else {
				flash("error", "Senha incorreta.");
				if (request.headers.containsKey("mobile")) {
					renderText("false");
				} else {
					index();
				}
			}
		} else {
			flash("error", "Usuario não existe.");
			if (request.headers.containsKey("mobile")) {
				renderText("false");
			} else {
				index();
			}
		}
	}

	static public void logout() {
		if (session.contains("user")) {
			session.remove("user");
			session.clear();
		}
		index();
	}

	static public void ranking() {
		int qtd = 0;
		if (params._contains("qtd")) {
			Integer.parseInt(params.get("qtd"));
		} else {
			qtd = 100;
		}

		List<Jogador> jogadores = Jogador
				.find("ORDER BY desistencias ASC, vitorias DESC, empates DESC, derrotas ASC, pontuacao DESC")
				.fetch(qtd);

		if (session.contains("mobile")) {
			renderTemplate("Application/rankingmobile.html", jogadores);
		} else {
			render(jogadores);
		}

	}

	static public void jogador() {
		if (request.method.equalsIgnoreCase("post")) {
			String nome = params.get("nome");
			String email = params.get("email");
			String senha = params.get("senha");

			boolean emailValido = validation.email(email).ok;
			if (emailValido) {
				boolean emailLivre = Jogador.find("email = ?", email).first() == null;
				boolean nomeLivre = Jogador.find("nome = ?", nome).first() == null;
				if (emailLivre) {
					if (nomeLivre) {
						senha = Crypto.passwordHash(senha, HashType.SHA512);
						new Jogador(nome, email, senha).save();
						flash("success", "Usuário cadastrado com sucesso.");
						index();
					} else {
						flash("error", "Nome já cadastrado.");
						cadastrar();
					}
				} else {
					flash("error", "Email já cadastrado.");
					cadastrar();
				}
			} else {
				flash("error", "Email inválido.");
				cadastrar();
			}
		}

		int id = Integer.parseInt(params.get("id"));
		Jogador jogador = Jogador.find("byId", (long) id).first();
		jogador = (jogador == null) ? new Jogador("O jogador não existe.", "",
				"") : jogador;
		render(jogador);
	}

	static public void cadastrar() {
		render();
	}
}